#include <setjmp.h> void longjmp(env, value); jmp_buf env; переменная, в которойхранится окружение int value; значение, возвращаемое при вызове setjmp.
Описание.
Функция longjmp восстанавливает состояние стека, ранее сохраненное в env функцией setjmp .
Функции setjmp и longjmp обеспечивают возможность выполнения нелокального (nonlocal ) перехода и обычно используются для передачи управления на выполнение обработки ошибок; восстанавливают код в ранее вызванной процедуре (без использования обычного вызова); возвращают условные обозначения.
Вызовом setjmp сохраняется текущее состояние стека в env. Последующий вызов longjmp восстанавливает сохраненное состояние и возвращает управление на указатель (точку входа), непосредственно следующий за соответствующим вызовом setjmp .
Выполнение возобновляется, когда вызов setjmp возвращает заданное value . Когда вызывается longjmp , значения всех переменных (за исключением переменных регистра) становятся доступными для процедуры, которая принимает управление и содержит значения этих переменных. Значения переменных регистра непредсказуемы.
Функция longjmp должна вызываться ранее функции, определяющей возврат setjmp . Если longjmp вызвана после функции, определяющей возврат setjmp, то может произойти непредсказуемое поведение программы.
Значение value , возвращаемое longjmp , должно быть ненулевым. Если для value задан аргумент 0, значение возврата заменяется значением 1.
Возвращаемое значение.
Возвращаемого значения нет.
Предупреждение!
Значения переменных регистра в процедуре, вызывающей setjmp , после выполнения longjmp не могут быть восстановлены к собственным значениям.
Пример:
#include <stdio.h> #include <setjmp.h> jmp_buf mark; main() { if (setjmp(mark) != 0) { printf("longjmp has been called\n"); recover(); exit(1); } printf("setjmp has been called\n"); . . . p(); . . . } p() { int error = 0; . . . if (error != 0) longjmp(mark, -1); . . . } recover() { /* при выходе из программы убедитесь, что файлы данных не будут запорчены */ . . . }